<?php

/* Form Criar Bolão para Usuários */

class Application_Form_CriarBolao extends Zend_Form
{
    //Elementos do Form:
    private $_campoNomeBolao;
    private $_campeonatoSeletor;
    private $_valorCampeonato;
    private $_jogoSeletor;    
    private $_novoBolaoBotao;
    private $_campoEmails;

    //Mappers:
    private $_campeonatoMapper;
    private $_jogoMapper;
    
    //outros:
    private $_listaEmails;
    private $_msgErroJogos;

    //Construtor:
    public function __construct(Application_Model_CampeonatoMapper $campeonato,
                                Application_Model_JogoMapper $jogo,
                                $post = null, $options = null)
    {
        $this->_campeonatoMapper = $campeonato;
        $this->_jogoMapper = $jogo;

        //usando a GAMBIARRA MODE:
        if (isset($post) && is_array($post))
        {
            $this->prepararCamposExtras($post);
        }

        parent::__construct($options);

    }

    //Init:
    public function init()
    {
        $this->setMethod('post');        
        $this->setDecorators(array(
            'FormElements',
            array('Description', array('placement' => 'prepend')),
            'Form'
        ));
        //setando o flag de msg de erros para jogos inexistentes para 0.
        $this->_msgErroJogos = 0;
        if($this->adicionaCampeonato() == false)
            echo 'Não existe campeonatos cadastrados no sistema.';

    }

    //Adiciona um seletor de campeonatos ao form:
    private function adicionaCampeonato()
    {

        if (isset($this->_campeonatoSeletor)) {
            return;
        }

        $this->_campeonatoSeletor = new Zend_Form_Element_Select('s_campeonato',
                                    array('onChange' => 'submit()',));

        $this->_campeonatoSeletor->setLabel('Campeonato')->addMultioption(null, '');

        $listaDeCampeonatos = $this->_campeonatoMapper->fetchAll();

        //se existe algum campeonato:
        if(count($listaDeCampeonatos) != 0){

            foreach ($listaDeCampeonatos as $camp) {
                $nome = $camp->getNome();
                //retorna o segundo argumento para o seletor visível ao usuário
                //e o primeiro argumento retorna para o controller.
                $this->_campeonatoSeletor->addMultiOption($nome, $nome);                
            }
            $this->addElement($this->_campeonatoSeletor);
            return true;
        } else {
            //não existe campeonatos cadastrados:
            return false;
        }

    }//fim adicionaCampeonato


    //Adiciona um campo para inserir o nome do Bolao:
    private function adicionaCampoNomeBolao()
    {

        if (!isset($this->_campoNomeBolao)) {

            $this->_campoNomeBolao = new Zend_Form_Element_Text('nomeBolao');

            $this->_campoNomeBolao->setLabel('Nome do Bolão');
            
            $this->_campoNomeBolao->setValue('Meu Bolão');

            $this->_campoNomeBolao->setRequired(true);
            
            $this->_campoNomeBolao->addValidators(array(array('alnum', true, true),
                                                        array('stringLength', false, array(1, 50))));         

            $this->addElement($this->_campoNomeBolao);

            
        }
    }

    //Adiciona um seletor de Jogos:
    private function adicionaJogos()
    {

        if (!isset($this->_jogoSeletor)) {

            $this->_jogoSeletor = new Zend_Form_Element_Select('jogo');

            $this->_jogoSeletor->setLabel('Jogo');

            $this->addElement($this->_jogoSeletor);
        }
    }

    private function criarCampoEmail()
    {
        if(!isset($this->_campoEmails))
        {
            //Adicionando a text Area para pegar email dos convidados:
            $this->_campoEmails = new Zend_Form_Element_Textarea('emails');
            $this->_campoEmails->setLabel('Insira o e-mail de seus amigos, separado por vírgulas:');
            $this->_campoEmails->setRequired(true);
            $this->addElement($this->_campoEmails);
        }
    }

    public function validarCampoEmail()
    {
        if($this->_campoEmails->isValid($this->_campoEmails->getValue())){
            $validador = new Zend_Validate_EmailAddress();
            $listaEmail = $this->_campoEmails->getValue();
            //corta a string por virgulas e valida cada parte como um email:
            $token = strtok($listaEmail, ",");
            while($token){
                $umEmail = trim($token);
                if($validador->isValid($umEmail) == false){
                    $this->_listaEmails = array();
                    return false;
                }
                $this->_listaEmails[] = $umEmail;
                $token = strtok(",");
            }
            return true;

        } else return false;
    }

    //Adicionando botao Criar novo bolão ao Form:
    private function adicionaBotaoNovoBolao($status)
    {
        $this->_novoBolaoBotao = new Zend_Form_Element_Submit('criarBolao');

        $this->_novoBolaoBotao->setLabel('Criar novo bolão')
                          ->setIgnore(true);
        if($status == true) $this->addElement($this->_novoBolaoBotao);

    }
    
    //insere os Jogos na lista correspondente:
    private function populaJogos()
    {

        $this->_jogoSeletor->clearMultiOptions();

        //pegando a lista de jogos conforme o campeonato selecionado.
        $listaDeJogos = $this->_jogoMapper->localizarPeloCampeonato($this->getValue('campeonato'));

        //existe algum jogo na lista do campeonato selecionado:
        if (count($listaDeJogos) != 0){

            foreach ($listaDeJogos as $umJogo) {
            //pegando as informações relevantes (time A, time B e data):
            $nomeTimeA = $umJogo->getTimeA();
            $nomeTimeB = $umJogo->getTimeB();
            $nomeData = $umJogo->getData();
            //concatenando strings para adicionar ao seletor:
            //as strings ficarão na forma "time A x time B em: data".
            $nomeJogo = $nomeTimeA.' x '.$nomeTimeB.' em: '.$nomeData;
            $idJogo = $umJogo->getId();

            //retorna o segundo argumento para o seletor visível ao usuário
            //e o primeiro argumento retorna para o controller.
            $this->_jogoSeletor->addMultiOption($idJogo, $nomeJogo);
            }

            $this->_jogoSeletor->setValue($this->getValue('jogo'));
            return true;

        } else {
            $this->_jogoSeletor->addMultiOption(0,'Sem jogos para este campeonato');
            $this->_jogoSeletor->setValue(0);
            return false;
        }
    }//fim populaJogos

    private function selecionarCampeonato()
    {
        $this->_valorCampeonato = new Zend_Form_Element_Hidden('campeonato');
        $this->_valorCampeonato->setValue($this->_campeonatoSeletor->getvalue());
        $this->addElement($this->_valorCampeonato);
    }

    private function prepararCamposExtras($post)
    {
        if (null != $post) {
            $this->populate($post);
        }

        $this->selecionarCampeonato();
        $this->adicionaJogos();
        
        //botao  de criar bolao só aparece se existirem jogos
        //para o campeonato escolhido:
        $botaoSubmitHabilitado = false;

        if($this->populaJogos() == false){
            $this->_msgErroJogos++;
        } else {
            //adiciona os outros elementos do Form:
            $this->adicionaCampoNomeBolao();
            $this->criarCampoEmail();
            $botaoSubmitHabilitado = true;
            $this->_msgErroJogos = 0;
        }        

        //O botao de Novo Bolao precisa estar instanciado,  portanto está fora
        //do else acima. Apenas controlamos se ele aparece no form ou não, pelo
        //parâmetro passado.
        $this->adicionaBotaoNovoBolao($botaoSubmitHabilitado);

        if (null != $post) {
            $this->populate($post);
        }

        //Unica forma encontrada para que essa mensagem de erro não
        //surgisse duplicada.
        if($this->_msgErroJogos == 1) {
            echo 'Não há jogos cadastrados para este campeonato. Por favor escolha outro campeonato.';
        }
    }

    public function validarCampoNomeBolao()
    {
        if(isset($this->_campoNomeBolao))
        {
            $nomeDigitado = $this->_campoNomeBolao->getValue();
            return $this->_campoNomeBolao->isValid($nomeDigitado);
        } else return false;
    }


    public function isValid ($post)
    {        
        //Se o botão de submit foi pressionado, então o post é valido.
        if(null != $this->_novoBolaoBotao && $this->validarCampoNomeBolao()
                && $this->_novoBolaoBotao->isChecked()){
            return true;            
        } else {
            //caso contrário, deve-se repopular as listas:
            $this->prepararCamposExtras($post);
            return false;
        }      

    }

    public function getListaEmails()
    {
        return $this->_listaEmails;
    }


}//fim classe

